/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.primitivas;

import com.vividsolutions.jts.geom.Coordinate;
import java.util.HashSet;
import java.util.Set;
import java.util.Iterator;
import java.util.List;
import modelo.Localizacion;

/**
 *
 * @author Diego
 */
public class Punto {

    private Coordinate puntoCoordenada;

    public Punto()
    {
        puntoCoordenada = new Coordinate();
    }

    public Punto(double x,double y)
    {
        puntoCoordenada = new Coordinate(x, y);
    }

    public Punto(Coordinate vCoordenada)
    {
        puntoCoordenada = vCoordenada;
    }

    public Coordinate getPuntoCoordenada()
    {
        return puntoCoordenada;
    }

    public void setPuntoCoordenada(double x,double y)
    {
        puntoCoordenada.x = x;
        puntoCoordenada.y = y;
    }

    public double getCoordenadaX()
    {
        return puntoCoordenada.x;
    }

    public double getCoordenadaY()
    {
        return puntoCoordenada.y;
    }

    public boolean esIgual(Punto pPunto)
    {
       if(puntoCoordenada.x==pPunto.getCoordenadaX()&&puntoCoordenada.y==pPunto.getCoordenadaY())
           return true;
       else return false;
    }
    
    public void imprimirPunto()
    {
        System.out.print("("+puntoCoordenada.x+","+puntoCoordenada.y+")");
    }

    public String textoPunto()
    {
        return "("+puntoCoordenada.x+","+puntoCoordenada.y+")";
    }

    public static void imprimirConjuntoPuntos(Set<Punto> pConjunto,String titulo)
    {
        System.out.println(titulo);
        Iterator<Punto> puntos = pConjunto.iterator();
        while(puntos.hasNext())
        {
            puntos.next().imprimirPunto();
            System.out.print(" ; ");
        }
        System.out.println();
    }

    public static String textoConjuntoPuntos(Set<Punto> pConjunto,String titulo)
    {
        StringBuilder texto = new StringBuilder();
        texto.append(titulo+"\n");
        Iterator<Punto> puntos = pConjunto.iterator();
        String separador = "";
        while(puntos.hasNext())
        {
            texto.append(separador);
            texto.append(puntos.next().textoPunto());
            separador = " ; ";
        }
        texto.append("\n");
        return texto.toString();
    }

    public static boolean existeEnConjuntoPuntos(Set<Punto> conjuntoPuntos,Punto pPunto)
    {
        Iterator<Punto> recorrido = conjuntoPuntos.iterator();
        while(recorrido.hasNext())
        {
            Punto comprobar = recorrido.next();
            if(comprobar.esIgual(pPunto))
            {
                return true;
            }
        }
        return false;
    }
    
    public int localizarPunto(Punto vReferencia)
    {
        int localizacion = Localizacion.CENTRO;
        if(vReferencia.getCoordenadaX()==puntoCoordenada.x&&vReferencia.getCoordenadaY()>puntoCoordenada.y)
            localizacion = Localizacion.NORTE;
        else if(vReferencia.getCoordenadaX()==puntoCoordenada.x&&vReferencia.getCoordenadaY()<puntoCoordenada.y)
            localizacion = Localizacion.SUR;
        else if(vReferencia.getCoordenadaX()<puntoCoordenada.x&&vReferencia.getCoordenadaY()==puntoCoordenada.y)
            localizacion = Localizacion.OESTE;
        else if(vReferencia.getCoordenadaX()>puntoCoordenada.x&&vReferencia.getCoordenadaY()==puntoCoordenada.y)
            localizacion = Localizacion.ESTE;
        else if(vReferencia.getCoordenadaX()>puntoCoordenada.x&&vReferencia.getCoordenadaY()>puntoCoordenada.y)
            localizacion = Localizacion.NORESTE;
        else if(vReferencia.getCoordenadaX()<puntoCoordenada.x&&vReferencia.getCoordenadaY()>puntoCoordenada.y)
            localizacion = Localizacion.NOROESTE;
        else if(vReferencia.getCoordenadaX()<puntoCoordenada.x&&vReferencia.getCoordenadaY()<puntoCoordenada.y)
            localizacion = Localizacion.SUROESTE;
        else if(vReferencia.getCoordenadaX()>puntoCoordenada.x&&vReferencia.getCoordenadaY()<puntoCoordenada.y)
            localizacion = Localizacion.SURESTE;
        else localizacion = Localizacion.CENTRO;
        return localizacion;
    }
    
    public Punto puntoGreeneYao(Punto vReferencia,double relacionEnX,double relacionEnY)
    {
        int localizacion = localizarPunto(vReferencia);
        double coorX = -1;
        double coorY = -1;
        double aux = 0;
        switch(localizacion)
        {
            case Localizacion.NOROESTE:
                aux = vReferencia.getCoordenadaX();
                while(aux<puntoCoordenada.x)
                {
                    aux+=relacionEnX;
                }
                coorX = aux-relacionEnX;
                aux = vReferencia.getCoordenadaY();
                while(aux>puntoCoordenada.y)
                {
                    aux-=relacionEnY;
                }
                coorY = aux+relacionEnY;
                break;
            case Localizacion.NORESTE:
                aux = vReferencia.getCoordenadaX();
                while(aux>puntoCoordenada.x)
                {
                    aux-=relacionEnX;
                }
                coorX = aux+relacionEnX;
                aux = vReferencia.getCoordenadaY();
                while(aux>puntoCoordenada.y)
                {
                    aux-=relacionEnY;
                }
                coorY = aux+relacionEnY;
                break;
            case Localizacion.SUROESTE:
                aux = vReferencia.getCoordenadaX();
                while(aux<puntoCoordenada.x)
                {
                    aux+=relacionEnX;
                }
                coorX = aux-relacionEnX;
                aux = vReferencia.getCoordenadaY();
                while(aux<puntoCoordenada.y)
                {
                    aux+=relacionEnY;
                }
                coorY = aux-relacionEnY;
                break;
            case Localizacion.SURESTE:
                aux = vReferencia.getCoordenadaX();
                while(aux>puntoCoordenada.x)
                {
                    aux-=relacionEnX;
                }
                coorX = aux+relacionEnX;
                aux = vReferencia.getCoordenadaY();
                while(aux<puntoCoordenada.y)
                {
                    aux+=relacionEnY;
                }
                coorY = aux-relacionEnY;
                break;
            default:
                System.out.println("No es necesario crear el punto Greene Yao.");
                break;
        }
        
        if(coorX>-1 && coorY>-1)
            return new Punto(coorX, coorY);
        else return null;
    }

    public static Coordinate[] puntosToArrayCoordinates(List<Punto> puntos)
    {
        Iterator<Punto> recorrido = puntos.iterator();
        Coordinate [] retorno = new Coordinate[puntos.size()];
        int i=0;
        while(recorrido.hasNext())
        {
            retorno[i]=recorrido.next().getPuntoCoordenada();
            i++;
        }
        return retorno;
    }

    public static Set<Punto> removerPuntos(Set<Punto> conjunto,Set<Punto> comparado)
    {
        Set<Punto> retorno = new HashSet<Punto>();
        Iterator<Punto> recorrido = conjunto.iterator();
        while(recorrido.hasNext())
        {
            Punto nuevo = recorrido.next();
            if(!Punto.existeEnConjuntoPuntos(comparado, nuevo))
                retorno.add(nuevo);
        }
        return retorno;
    }
    
    
}
